﻿#pragma once
#include<locale.h>
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<stdbool.h>
#include <time.h>
#define WALL L'□'
#define BODY L'●'
#define FOOD L'★'
#define POS_X 24
#define POS_Y 5

//类型声明

//状态
enum GAME_STATUS
{
    OK,//正常退出
    KILL_BY_WALL,  //撞墙
    KILL_BY_SELF,  //撞到自己
    END_NORMAL  //正常退出
};

//方向
enum DIRECTION
{
    UP = 1,
    DOWN,
    LEFT,
    RIGHT
};

//蛇的节点类型
typedef struct SnakeNode
{
    int x;
    int y;
    struct SnakeNode* next;
}SnakeNode, * pSnakeNode;//结构体的指针

//贪吃蛇
typedef struct Snake
{
    pSnakeNode _pSnake;  //指向蛇头的指针
    pSnakeNode _pFood;  //指向食物节点的指针
    enum DIRECTION _dir;  //方向
    enum GAME_STATUS _status; //游戏状态
    int _food_weight;  //一个食物的分数
    int _score;        //总分
    int _sleep_time;  //休息时间
}Snake, * pSnake;

//函数声明
void SetPos(short x, short y);
//初始化游戏
void GameStart(pSnake ps);
//运行游戏
void GameRun(pSnake ps);
//欢迎界面打印
void WelcomeToGame();
//绘制地图
void CreateMap();
//4.创建蛇
void InitSanke(pSnake ps);
//5.创建食物
void CreateFood(pSnake ps);
//蛇走一步的过程
void SnakeMove(pSnake ps);
//检查下一个坐标是不是食物
int NextIsFood(pSnakeNode pn, pSnake ps);
//吃食物
void EatFood(pSnakeNode pn, pSnake ps);
//下一个位置不是食物
void NoFood(pSnakeNode pn, pSnake ps);
//检测蛇是否撞墙
void KillByWall(pSnake ps);
//检测蛇是否撞到自己
void KillBySelf(pSnake ps);
//游戏善后的工作
void GameEnd(pSnake ps);